package two_shang._11_23;

/*定义账户类，初始化账户余额。提供存钱和获取前的方法，开启两个线程操作账户,通过等待唤醒实现轮流存钱。
        1)定义银行账户Account类
        	定义int类型成员变量leftMoney，代表账户余额
        	定义构造方法，给账户初始化
        	定义deposit方法，给账户存钱
        	定义getLeftMoney方法，查看账户余额
        2)定义线程任务类Transfer,实现Runnable接口
        	定义Account类型成员变量account
        	定义标记
        	定义构造方法，给成员变量account赋值
        	覆盖重写run方法（使用同步方法或同步代码块保证数据安全,等待唤醒实现轮流存入），
            方法内部使用for循环，执行10次存钱，并打印账户余额的操作
        3)定义测试类
        	创建账户类Account的对象,初始化余额为1000元
        	创建线程任务Transfer类的对象，传递账户类Account的对象
        	创建2个Thread类的对象，传递线程任务Transfer类的对象并指定线程名称
        	2个Thread类的对象分别调用start方法，开启线程*/

public class VirtualBank {
    public static void main(String[] args) {
        Account account = new Account(1000);
        Transfer transfer1 = new Transfer(account);
        Transfer transfer2 = new Transfer(account);
        Thread thread1 = new Thread(transfer1, "李学健");
        Thread thread2 = new Thread(transfer2, "但丁");
        thread1.start();
        thread2.start();
    }
}

class Account {
    //账户余额
    private int leftMoney;

    boolean isOk = false;

    public void setLeftMoney(int leftMoney) {
        this.leftMoney = leftMoney;
    }

    synchronized void deposit() {
        if (isOk) {
            System.exit(0);
        }
        notifyAll();
        this.leftMoney += 100;
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println(Thread.currentThread().getName() + "存取了" + 100 + "块钱" + "     你现在有" + this.leftMoney);
        try {
            wait();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    public int getLeftMoney() {
        return leftMoney;
    }

    public Account() {
    }

    public Account(int leftMoney) {
        this.leftMoney = leftMoney;
    }
}

class Transfer implements Runnable {

    Account account;
    boolean flag = true;

    public Transfer() {
    }

    public Transfer(Account account) {
        this.account = account;
    }

    @Override
    public void run() {
        for (int i = 0; i <= 10; i++) {
            if (i == 10) this.account.isOk = true;
            this.account.deposit();
        }
    }
}